package R

import "fmt"

type Code int

type CodeMsg struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
	Tip  string `json:"tip,omitempty"`
}

func (c Code) Msg() string {
	msg, ok := codeAndMsg[c]
	if ok {
		return msg
	}
	return c.Tip()
}

func (c Code) Tip() string {
	tip, ok := codeAndTip[c]
	if ok {
		return tip
	}
	return ""
}

func (c Code) Error() string {
	return fmt.Sprintf("code=%d,msg=%v,tip=%v", c, c.Msg(), c.Tip())
}

func (c Code) Struct() CodeMsg {
	return CodeMsg{Code: int(c), Msg: c.Msg(), Tip: c.Tip()}
}

func New(code int, msg string) error {
	return fmt.Errorf("code:%d,msg:%s", code, msg)
}

func (c Code) SetMsg(msg string) CodeMsg {
	return CodeMsg{Code: int(c), Msg: msg, Tip: c.Tip()}
}

func (c Code) SetTip(tip string) CodeMsg {
	return CodeMsg{Code: int(c), Msg: c.Msg(), Tip: tip}
}
